This is a dynamic document which provides reproduction code and further visualizations not found in the final paper. The R Markdown source file for this document can be downloaded by clicking the “Code” dropdown menu in the uppermost right hand corner of the document and selecting “Download Rmd”. Each block of code for the associated visualization can be viewed or hidden by clicking the appropriate “Code” button.

# load libraries and data
library(tidyverse)
library(haven)
library(dplyr)
# library(ggplot2)
library(plotly)
library(stargazer)
library(knitr)
guns_df <- read_dta("Guns.dta")

Data Management

To facilitate easier coding later on, some basic changes were made to the data set.

The first ten rows of the resulting data set are as follows:

# DATA MANAGEMENT

# create natural log columns and write out full years
guns_df <- guns_df %>% 
  mutate(
    lnvio = log(vio),
    lnmur = log(mur),
    lnrob = log(rob),
    year = year + 1900
  ) 

# create groups based on shall-issue laws
# group 0: uncategorized states. no observation should be assigned group 0 by the end
# group 1: states that had shall-issue law during the entire data set
# group 2: states that never had shall-issue law during the entire data set
# group 3: states that started without a shall-issue law but enacted one during the data set
guns_df <- guns_df %>% mutate(group=0)
for(i in 1:nrow(guns_df)) {
  # checks if this observation has not been grouped yet
  if (guns_df$group[i]==0) {
    # if they do not have one already, we will first assume that the state 
    # will not enact a shall-issue and therefore assign group 2 to every 
    # observation of that state
    if (guns_df$shall[i]==0) {
      for(j in 1:nrow(guns_df)) {
        if (guns_df$stateid[j]==guns_df$stateid[i]) {
          guns_df$group[j] <- 2
        }
      }
    # we know that no state abolished a shall-issue law during this data set
    # so if it hasn't been categorized yet and has a shall-issue law,
    # we assign group 3 to ever observation of that state
    } else if(guns_df$shall[i]==1) {
      for(j in 1:nrow(guns_df)) {
        if (guns_df$stateid[j]==guns_df$stateid[i]) {
          guns_df$group[j] <- 1
        }
      }
    }
  # checks if this observation has already been grouped
  } else if (!guns_df$group[i]==0) {
    # if the state was previously assigned to group 2, but has now enacted a shall-issue law
    # we will assign it to group 3
    if (guns_df$group[i]==2 & guns_df$shall[i]==1) {
      for(j in 1:nrow(guns_df)) {
        if (guns_df$stateid[j]==guns_df$stateid[i]) {
          guns_df$group[j] <- 3
        }
      }
    }
  }
}
guns_df <- guns_df %>% mutate(group = as_factor(group))

kable(guns_df[1:10,])
year vio mur rob incarc_rate pb1064 pw1064 pm1029 pop avginc density stateid shall lnvio lnmur lnrob group
1977 414.4 14.2 96.8 83 8.384873 55.12291 18.17441 3.780403 9.563149 0.0745524 1 0 6.026832 2.653242 4.572647 2
1978 419.1 13.3 99.1 94 8.352101 55.14367 17.99408 3.831838 9.932000 0.0755667 1 0 6.038110 2.587764 4.596129 2
1979 413.3 13.2 109.5 144 8.329575 55.13586 17.83934 3.866248 9.877028 0.0762453 1 0 6.024174 2.580217 4.695925 2
1980 448.5 13.2 132.1 141 8.408386 54.91259 17.73420 3.900368 9.541428 0.0768288 1 0 6.105909 2.580217 4.883559 2
1981 470.5 11.9 126.5 149 8.483435 54.92513 17.67372 3.918531 9.548351 0.0771866 1 0 6.153796 2.476538 4.840242 2
1982 447.7 10.6 112.0 183 8.514000 54.89621 17.51052 3.925229 9.478919 0.0773185 1 0 6.104123 2.360854 4.718499 2
1983 416.0 9.2 98.4 215 8.545608 54.83936 17.35089 3.934103 9.783000 0.0774933 1 0 6.030685 2.219203 4.589041 2
1984 431.2 9.4 96.1 243 8.559511 54.77876 17.11902 3.951826 10.357200 0.0778424 1 0 6.066572 2.240710 4.565389 2
1985 457.5 9.8 105.4 256 8.562801 54.67899 16.85875 3.972520 10.725858 0.0782500 1 0 6.125777 2.282382 4.657763 2
1986 558.0 10.1 111.6 267 8.566521 54.51791 16.57609 3.991562 11.091618 0.0786251 1 0 6.324359 2.312536 4.714921 2

Dynamic 3D Visualization

In order to view each state individually graphed across time, I graphed the data in three dimensions separating by State ID (stateid) on the x axis. This graph can be zoomed, rotated, and panned to visually inspect patterns in the data.

# VIZUALIZATION 1

df <- guns_df #%>% filter(group==3) # Uncomment to only graph group 3
viz1 <- plot_ly(
  x=df$stateid, 
  y=df$year, 
  z=df$lnvio, 
  type="scatter3d", 
  mode="markers", 
  color=df$stateid,
)
viz1 <- viz1 %>% layout(scene = list(
  xaxis = list(title = 'State ID'),
  yaxis = list(title = 'Year'),
  zaxis = list(title = 'Rate of Violence')
  )
)
viz1

Grouped Visualizations

Grouping the shall-issue and non shall-issue states together allowed me to graph them over time and get a better idea of how correlated the groups were. The high correlation indicates that there are other factors affecting crime on a national level, but I also notice that Group 3 does appear to get closer to Group 2 and further from Group 1 as more of the states enact shall-issue laws.

# VIZUALIZATION 2

# Graph change in violence over time, grouped by preponderance of shall-issue laws
# Split data frame into groups
df <- aggregate(lnvio~group+year,data=guns_df,FUN=mean)
viz2 <-
  # Set base properties of the graph
  ggplot(
    data=df,
    aes(x=year, y=lnvio)
  ) +
  # Graph line for group 1
  geom_line(
    data=filter(df,group==1),
    aes(color=group) 
  ) +
  # Graph line for group 2
  geom_line(
    data=filter(df,group==2),
    aes(color=group) 
  ) +
  # Graph line for group 3
  geom_line(
    data=filter(df,group==3),
    aes(color=group) 
  ) +
  # Label things
  labs(
    title = "Change in Violence over Time",
    subtitle = "Grouped by Preponderance of Shall-Issue Laws",
    x = "Year",
    y = "Rate of Violence (as natural log)",
    
    caption = "Group 1: states that had a shall-issue law during the entire data set
Group 2: states that never had a shall-issue law during the entire data set
Group 3: states that started without a shall-issue law but enacted one during the data set"
  ) +
  theme(
    plot.caption = element_text(hjust = 0) # Align caption to the left, instead of the default right alignment
  )
viz2

# VIZUALIZATION 3

# Graph change in violence over time, grouped by preponderance of shall-issue laws
# Split data frame into groups
df <- aggregate(lnvio~group+year,data=guns_df,FUN=mean)
viz3 <-
  # Set base properties of the graph
  ggplot(
    data=df,
    aes(x=year, y=lnvio)
  ) +
  # Graph data points and color them by group
  geom_point(
    data=guns_df,
    aes(color=group), 
    alpha = 0.5
  ) +
  # Graph line for group 1
  geom_line(
    data=filter(df,group==1),
    aes(color=group) 
  ) +
  # Graph line for group 2
  geom_line(
    data=filter(df,group==2),
    aes(color=group) 
  ) +
  # Graph line for group 3
  geom_line(
    data=filter(df,group==3),
    aes(color=group) 
  ) +
  # Label things
  labs(
    title = "Change in Violence over Time",
    subtitle = "Grouped by Preponderance of Shall-Issue Laws",
    x = "Year",
    y = "Rate of Violence (as natural log)",
    
    caption = "Group 1: states that had a shall-issue law during the entire data set
Group 2: states that never had a shall-issue law during the entire data set
Group 3: states that started without a shall-issue law but enacted one during the data set"
  ) +
  theme(
    plot.caption = element_text(hjust = 0) # Align caption to the left, instead of the default right alignment
  )
viz3

Regressions

I do not find visual representations of a binary variable to be very helpful, so I did not include them in the paper. Nonetheless, here they are.

# Basic black and white visualization
reg1 <- lm(lnvio~shall, data=guns_df)
plot(
  x = guns_df$shall, 
  y = guns_df$lnvio,
  xlab = "Shall-Issue",
  ylab = "Rate of Violence (as Natural Log)",
  main = "Correlation between Shall-Issue laws and Violence"
) + 
abline(reg1)

## integer(0)
# Prettier visualization
# Set base properties of the graph
ggplot(
  data=guns_df,
  aes(x=shall, y=lnvio)
) +
# Graph points
geom_point(
  data=guns_df,
  aes(color=group), 
  alpha = 0.5
) +
# Graph linear model regression line
geom_smooth(
  method = "lm",
  color="black"
) +
# Label things
labs (
  title = "Correlation between Shall-Issue and Violence",
  x = "Shall-Issue",
  y = "Rate of Violence (as Natural Log)"
)
## `geom_smooth()` using formula 'y ~ x'

LS0tCnRpdGxlOiAiRWZmZWN0cyBvZiBDb25jZWFsZWQtQ2FycnkgTGF3cyBvbiBDcmltZSBSYXRlcyIKYXV0aG9yOiAiSm9uYXRoYW4gQm9ubmV5IgpkYXRlOiAiT2N0b2JlciAyMDIxIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgpUaGlzIGlzIGEgZHluYW1pYyBkb2N1bWVudCB3aGljaCBwcm92aWRlcyByZXByb2R1Y3Rpb24gY29kZSBhbmQgZnVydGhlciB2aXN1YWxpemF0aW9ucyBub3QgZm91bmQgaW4gdGhlIGZpbmFsIHBhcGVyLiBUaGUgUiBNYXJrZG93biBzb3VyY2UgZmlsZSBmb3IgdGhpcyBkb2N1bWVudCBjYW4gYmUgZG93bmxvYWRlZCBieSBjbGlja2luZyB0aGUgIkNvZGUiIGRyb3Bkb3duIG1lbnUgaW4gdGhlIHVwcGVybW9zdCByaWdodCBoYW5kIGNvcm5lciBvZiB0aGUgZG9jdW1lbnQgYW5kIHNlbGVjdGluZyAiRG93bmxvYWQgUm1kIi4gRWFjaCBibG9jayBvZiBjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCB2aXN1YWxpemF0aW9uIGNhbiBiZSB2aWV3ZWQgb3IgaGlkZGVuIGJ5IGNsaWNraW5nIHRoZSBhcHByb3ByaWF0ZSAiQ29kZSIgYnV0dG9uLgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIGxvYWQgbGlicmFyaWVzIGFuZCBkYXRhCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGhhdmVuKQpsaWJyYXJ5KGRwbHlyKQojIGxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoc3RhcmdhemVyKQpsaWJyYXJ5KGtuaXRyKQpndW5zX2RmIDwtIHJlYWRfZHRhKCJHdW5zLmR0YSIpCmBgYAoKIyMgRGF0YSBNYW5hZ2VtZW50ClRvIGZhY2lsaXRhdGUgZWFzaWVyIGNvZGluZyBsYXRlciBvbiwgc29tZSBiYXNpYyBjaGFuZ2VzIHdlcmUgbWFkZSB0byB0aGUgZGF0YSBzZXQuCgotIEFkZGVkIG5hdHVyYWwgbG9nIGNvbHVtbnMgZm9yIHRoZSB2YXJpb3VzIGNyaW1lIHJhdGVzCi0gQ2hhbmdlZCB5ZWFyIHRvIGluY2x1ZGUgZnVsbCB5ZWFyLCBub3QganVzdCB0aGUgbGFzdCB0d28gZGlnaXRzCi0gR3JvdXBlZCBkYXRhIHNldCBpbnRvIHRocmVlIGdyb3VwcyBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCB0aGUgc3RhdGUgaGFkIGEgc2hhbGwtaXNzdWUgbGF3IGluIHBsYWNlOgogIC0gR3JvdXAgMTogc3RhdGVzIHRoYXQgaGFkIHNoYWxsLWlzc3VlIGxhdyBkdXJpbmcgdGhlIGVudGlyZSBkYXRhIHNldAogIC0gR3JvdXAgMjogc3RhdGVzIHRoYXQgbmV2ZXIgaGFkIHNoYWxsLWlzc3VlIGxhdyBkdXJpbmcgdGhlIGVudGlyZSBkYXRhIHNldAogIC0gR3JvdXAgMzogc3RhdGVzIHRoYXQgc3RhcnRlZCB3aXRob3V0IGEgc2hhbGwtaXNzdWUgbGF3IGJ1dCBlbmFjdGVkIG9uZSBkdXJpbmcgdGhlIGRhdGEgc2V0CiAgClRoZSBmaXJzdCB0ZW4gcm93cyBvZiB0aGUgcmVzdWx0aW5nIGRhdGEgc2V0IGFyZSBhcyBmb2xsb3dzOgoKYGBge3IgZGF0YV9tYW5hZ2VtZW50fQojIERBVEEgTUFOQUdFTUVOVAoKIyBjcmVhdGUgbmF0dXJhbCBsb2cgY29sdW1ucyBhbmQgd3JpdGUgb3V0IGZ1bGwgeWVhcnMKZ3Vuc19kZiA8LSBndW5zX2RmICU+JSAKICBtdXRhdGUoCiAgICBsbnZpbyA9IGxvZyh2aW8pLAogICAgbG5tdXIgPSBsb2cobXVyKSwKICAgIGxucm9iID0gbG9nKHJvYiksCiAgICB5ZWFyID0geWVhciArIDE5MDAKICApIAoKIyBjcmVhdGUgZ3JvdXBzIGJhc2VkIG9uIHNoYWxsLWlzc3VlIGxhd3MKIyBncm91cCAwOiB1bmNhdGVnb3JpemVkIHN0YXRlcy4gbm8gb2JzZXJ2YXRpb24gc2hvdWxkIGJlIGFzc2lnbmVkIGdyb3VwIDAgYnkgdGhlIGVuZAojIGdyb3VwIDE6IHN0YXRlcyB0aGF0IGhhZCBzaGFsbC1pc3N1ZSBsYXcgZHVyaW5nIHRoZSBlbnRpcmUgZGF0YSBzZXQKIyBncm91cCAyOiBzdGF0ZXMgdGhhdCBuZXZlciBoYWQgc2hhbGwtaXNzdWUgbGF3IGR1cmluZyB0aGUgZW50aXJlIGRhdGEgc2V0CiMgZ3JvdXAgMzogc3RhdGVzIHRoYXQgc3RhcnRlZCB3aXRob3V0IGEgc2hhbGwtaXNzdWUgbGF3IGJ1dCBlbmFjdGVkIG9uZSBkdXJpbmcgdGhlIGRhdGEgc2V0Cmd1bnNfZGYgPC0gZ3Vuc19kZiAlPiUgbXV0YXRlKGdyb3VwPTApCmZvcihpIGluIDE6bnJvdyhndW5zX2RmKSkgewogICMgY2hlY2tzIGlmIHRoaXMgb2JzZXJ2YXRpb24gaGFzIG5vdCBiZWVuIGdyb3VwZWQgeWV0CiAgaWYgKGd1bnNfZGYkZ3JvdXBbaV09PTApIHsKICAgICMgaWYgdGhleSBkbyBub3QgaGF2ZSBvbmUgYWxyZWFkeSwgd2Ugd2lsbCBmaXJzdCBhc3N1bWUgdGhhdCB0aGUgc3RhdGUgCiAgICAjIHdpbGwgbm90IGVuYWN0IGEgc2hhbGwtaXNzdWUgYW5kIHRoZXJlZm9yZSBhc3NpZ24gZ3JvdXAgMiB0byBldmVyeSAKICAgICMgb2JzZXJ2YXRpb24gb2YgdGhhdCBzdGF0ZQogICAgaWYgKGd1bnNfZGYkc2hhbGxbaV09PTApIHsKICAgICAgZm9yKGogaW4gMTpucm93KGd1bnNfZGYpKSB7CiAgICAgICAgaWYgKGd1bnNfZGYkc3RhdGVpZFtqXT09Z3Vuc19kZiRzdGF0ZWlkW2ldKSB7CiAgICAgICAgICBndW5zX2RmJGdyb3VwW2pdIDwtIDIKICAgICAgICB9CiAgICAgIH0KICAgICMgd2Uga25vdyB0aGF0IG5vIHN0YXRlIGFib2xpc2hlZCBhIHNoYWxsLWlzc3VlIGxhdyBkdXJpbmcgdGhpcyBkYXRhIHNldAogICAgIyBzbyBpZiBpdCBoYXNuJ3QgYmVlbiBjYXRlZ29yaXplZCB5ZXQgYW5kIGhhcyBhIHNoYWxsLWlzc3VlIGxhdywKICAgICMgd2UgYXNzaWduIGdyb3VwIDMgdG8gZXZlciBvYnNlcnZhdGlvbiBvZiB0aGF0IHN0YXRlCiAgICB9IGVsc2UgaWYoZ3Vuc19kZiRzaGFsbFtpXT09MSkgewogICAgICBmb3IoaiBpbiAxOm5yb3coZ3Vuc19kZikpIHsKICAgICAgICBpZiAoZ3Vuc19kZiRzdGF0ZWlkW2pdPT1ndW5zX2RmJHN0YXRlaWRbaV0pIHsKICAgICAgICAgIGd1bnNfZGYkZ3JvdXBbal0gPC0gMQogICAgICAgIH0KICAgICAgfQogICAgfQogICMgY2hlY2tzIGlmIHRoaXMgb2JzZXJ2YXRpb24gaGFzIGFscmVhZHkgYmVlbiBncm91cGVkCiAgfSBlbHNlIGlmICghZ3Vuc19kZiRncm91cFtpXT09MCkgewogICAgIyBpZiB0aGUgc3RhdGUgd2FzIHByZXZpb3VzbHkgYXNzaWduZWQgdG8gZ3JvdXAgMiwgYnV0IGhhcyBub3cgZW5hY3RlZCBhIHNoYWxsLWlzc3VlIGxhdwogICAgIyB3ZSB3aWxsIGFzc2lnbiBpdCB0byBncm91cCAzCiAgICBpZiAoZ3Vuc19kZiRncm91cFtpXT09MiAmIGd1bnNfZGYkc2hhbGxbaV09PTEpIHsKICAgICAgZm9yKGogaW4gMTpucm93KGd1bnNfZGYpKSB7CiAgICAgICAgaWYgKGd1bnNfZGYkc3RhdGVpZFtqXT09Z3Vuc19kZiRzdGF0ZWlkW2ldKSB7CiAgICAgICAgICBndW5zX2RmJGdyb3VwW2pdIDwtIDMKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KZ3Vuc19kZiA8LSBndW5zX2RmICU+JSBtdXRhdGUoZ3JvdXAgPSBhc19mYWN0b3IoZ3JvdXApKQoKa2FibGUoZ3Vuc19kZlsxOjEwLF0pCmBgYAoKIyMgRHluYW1pYyAzRCBWaXN1YWxpemF0aW9uCkluIG9yZGVyIHRvIHZpZXcgZWFjaCBzdGF0ZSBpbmRpdmlkdWFsbHkgZ3JhcGhlZCBhY3Jvc3MgdGltZSwgSSBncmFwaGVkIHRoZSBkYXRhIGluIHRocmVlIGRpbWVuc2lvbnMgc2VwYXJhdGluZyBieSBTdGF0ZSBJRCAoKnN0YXRlaWQqKSBvbiB0aGUgeCBheGlzLiBUaGlzIGdyYXBoIGNhbiBiZSB6b29tZWQsIHJvdGF0ZWQsIGFuZCBwYW5uZWQgdG8gdmlzdWFsbHkgaW5zcGVjdCBwYXR0ZXJucyBpbiB0aGUgZGF0YS4KCmBgYCB7ciB2aXp1YWxpemF0aW9uMX0KIyBWSVpVQUxJWkFUSU9OIDEKCmRmIDwtIGd1bnNfZGYgIyU+JSBmaWx0ZXIoZ3JvdXA9PTMpICMgVW5jb21tZW50IHRvIG9ubHkgZ3JhcGggZ3JvdXAgMwp2aXoxIDwtIHBsb3RfbHkoCiAgeD1kZiRzdGF0ZWlkLCAKICB5PWRmJHllYXIsIAogIHo9ZGYkbG52aW8sIAogIHR5cGU9InNjYXR0ZXIzZCIsIAogIG1vZGU9Im1hcmtlcnMiLCAKICBjb2xvcj1kZiRzdGF0ZWlkLAopCnZpejEgPC0gdml6MSAlPiUgbGF5b3V0KHNjZW5lID0gbGlzdCgKICB4YXhpcyA9IGxpc3QodGl0bGUgPSAnU3RhdGUgSUQnKSwKICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnWWVhcicpLAogIHpheGlzID0gbGlzdCh0aXRsZSA9ICdSYXRlIG9mIFZpb2xlbmNlJykKICApCikKdml6MQoKYGBgCgojIyBHcm91cGVkIFZpc3VhbGl6YXRpb25zCkdyb3VwaW5nIHRoZSBzaGFsbC1pc3N1ZSBhbmQgbm9uIHNoYWxsLWlzc3VlIHN0YXRlcyB0b2dldGhlciBhbGxvd2VkIG1lIHRvIGdyYXBoIHRoZW0gb3ZlciB0aW1lIGFuZCBnZXQgYSBiZXR0ZXIgaWRlYSBvZiBob3cgY29ycmVsYXRlZCB0aGUgZ3JvdXBzIHdlcmUuIFRoZSBoaWdoIGNvcnJlbGF0aW9uIGluZGljYXRlcyB0aGF0IHRoZXJlIGFyZSBvdGhlciBmYWN0b3JzIGFmZmVjdGluZyBjcmltZSBvbiBhIG5hdGlvbmFsIGxldmVsLCBidXQgSSBhbHNvIG5vdGljZSB0aGF0IEdyb3VwIDMgZG9lcyBhcHBlYXIgdG8gZ2V0IGNsb3NlciB0byBHcm91cCAyIGFuZCBmdXJ0aGVyIGZyb20gR3JvdXAgMSBhcyBtb3JlIG9mIHRoZSBzdGF0ZXMgZW5hY3Qgc2hhbGwtaXNzdWUgbGF3cy4KCmBgYHtyIHZpenVhbGl6YXRpb24yfQojIFZJWlVBTElaQVRJT04gMgoKIyBHcmFwaCBjaGFuZ2UgaW4gdmlvbGVuY2Ugb3ZlciB0aW1lLCBncm91cGVkIGJ5IHByZXBvbmRlcmFuY2Ugb2Ygc2hhbGwtaXNzdWUgbGF3cwojIFNwbGl0IGRhdGEgZnJhbWUgaW50byBncm91cHMKZGYgPC0gYWdncmVnYXRlKGxudmlvfmdyb3VwK3llYXIsZGF0YT1ndW5zX2RmLEZVTj1tZWFuKQp2aXoyIDwtCiAgIyBTZXQgYmFzZSBwcm9wZXJ0aWVzIG9mIHRoZSBncmFwaAogIGdncGxvdCgKICAgIGRhdGE9ZGYsCiAgICBhZXMoeD15ZWFyLCB5PWxudmlvKQogICkgKwogICMgR3JhcGggbGluZSBmb3IgZ3JvdXAgMQogIGdlb21fbGluZSgKICAgIGRhdGE9ZmlsdGVyKGRmLGdyb3VwPT0xKSwKICAgIGFlcyhjb2xvcj1ncm91cCkgCiAgKSArCiAgIyBHcmFwaCBsaW5lIGZvciBncm91cCAyCiAgZ2VvbV9saW5lKAogICAgZGF0YT1maWx0ZXIoZGYsZ3JvdXA9PTIpLAogICAgYWVzKGNvbG9yPWdyb3VwKSAKICApICsKICAjIEdyYXBoIGxpbmUgZm9yIGdyb3VwIDMKICBnZW9tX2xpbmUoCiAgICBkYXRhPWZpbHRlcihkZixncm91cD09MyksCiAgICBhZXMoY29sb3I9Z3JvdXApIAogICkgKwogICMgTGFiZWwgdGhpbmdzCiAgbGFicygKICAgIHRpdGxlID0gIkNoYW5nZSBpbiBWaW9sZW5jZSBvdmVyIFRpbWUiLAogICAgc3VidGl0bGUgPSAiR3JvdXBlZCBieSBQcmVwb25kZXJhbmNlIG9mIFNoYWxsLUlzc3VlIExhd3MiLAogICAgeCA9ICJZZWFyIiwKICAgIHkgPSAiUmF0ZSBvZiBWaW9sZW5jZSAoYXMgbmF0dXJhbCBsb2cpIiwKICAgIAogICAgY2FwdGlvbiA9ICJHcm91cCAxOiBzdGF0ZXMgdGhhdCBoYWQgYSBzaGFsbC1pc3N1ZSBsYXcgZHVyaW5nIHRoZSBlbnRpcmUgZGF0YSBzZXQKR3JvdXAgMjogc3RhdGVzIHRoYXQgbmV2ZXIgaGFkIGEgc2hhbGwtaXNzdWUgbGF3IGR1cmluZyB0aGUgZW50aXJlIGRhdGEgc2V0Ckdyb3VwIDM6IHN0YXRlcyB0aGF0IHN0YXJ0ZWQgd2l0aG91dCBhIHNoYWxsLWlzc3VlIGxhdyBidXQgZW5hY3RlZCBvbmUgZHVyaW5nIHRoZSBkYXRhIHNldCIKICApICsKICB0aGVtZSgKICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDApICMgQWxpZ24gY2FwdGlvbiB0byB0aGUgbGVmdCwgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCByaWdodCBhbGlnbm1lbnQKICApCnZpejIKYGBgCgpgYGAge3Igdml6dWFsaXphdGlvbjN9CiMgVklaVUFMSVpBVElPTiAzCgojIEdyYXBoIGNoYW5nZSBpbiB2aW9sZW5jZSBvdmVyIHRpbWUsIGdyb3VwZWQgYnkgcHJlcG9uZGVyYW5jZSBvZiBzaGFsbC1pc3N1ZSBsYXdzCiMgU3BsaXQgZGF0YSBmcmFtZSBpbnRvIGdyb3VwcwpkZiA8LSBhZ2dyZWdhdGUobG52aW9+Z3JvdXAreWVhcixkYXRhPWd1bnNfZGYsRlVOPW1lYW4pCnZpejMgPC0KICAjIFNldCBiYXNlIHByb3BlcnRpZXMgb2YgdGhlIGdyYXBoCiAgZ2dwbG90KAogICAgZGF0YT1kZiwKICAgIGFlcyh4PXllYXIsIHk9bG52aW8pCiAgKSArCiAgIyBHcmFwaCBkYXRhIHBvaW50cyBhbmQgY29sb3IgdGhlbSBieSBncm91cAogIGdlb21fcG9pbnQoCiAgICBkYXRhPWd1bnNfZGYsCiAgICBhZXMoY29sb3I9Z3JvdXApLCAKICAgIGFscGhhID0gMC41CiAgKSArCiAgIyBHcmFwaCBsaW5lIGZvciBncm91cCAxCiAgZ2VvbV9saW5lKAogICAgZGF0YT1maWx0ZXIoZGYsZ3JvdXA9PTEpLAogICAgYWVzKGNvbG9yPWdyb3VwKSAKICApICsKICAjIEdyYXBoIGxpbmUgZm9yIGdyb3VwIDIKICBnZW9tX2xpbmUoCiAgICBkYXRhPWZpbHRlcihkZixncm91cD09MiksCiAgICBhZXMoY29sb3I9Z3JvdXApIAogICkgKwogICMgR3JhcGggbGluZSBmb3IgZ3JvdXAgMwogIGdlb21fbGluZSgKICAgIGRhdGE9ZmlsdGVyKGRmLGdyb3VwPT0zKSwKICAgIGFlcyhjb2xvcj1ncm91cCkgCiAgKSArCiAgIyBMYWJlbCB0aGluZ3MKICBsYWJzKAogICAgdGl0bGUgPSAiQ2hhbmdlIGluIFZpb2xlbmNlIG92ZXIgVGltZSIsCiAgICBzdWJ0aXRsZSA9ICJHcm91cGVkIGJ5IFByZXBvbmRlcmFuY2Ugb2YgU2hhbGwtSXNzdWUgTGF3cyIsCiAgICB4ID0gIlllYXIiLAogICAgeSA9ICJSYXRlIG9mIFZpb2xlbmNlIChhcyBuYXR1cmFsIGxvZykiLAogICAgCiAgICBjYXB0aW9uID0gIkdyb3VwIDE6IHN0YXRlcyB0aGF0IGhhZCBhIHNoYWxsLWlzc3VlIGxhdyBkdXJpbmcgdGhlIGVudGlyZSBkYXRhIHNldApHcm91cCAyOiBzdGF0ZXMgdGhhdCBuZXZlciBoYWQgYSBzaGFsbC1pc3N1ZSBsYXcgZHVyaW5nIHRoZSBlbnRpcmUgZGF0YSBzZXQKR3JvdXAgMzogc3RhdGVzIHRoYXQgc3RhcnRlZCB3aXRob3V0IGEgc2hhbGwtaXNzdWUgbGF3IGJ1dCBlbmFjdGVkIG9uZSBkdXJpbmcgdGhlIGRhdGEgc2V0IgogICkgKwogIHRoZW1lKAogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCkgIyBBbGlnbiBjYXB0aW9uIHRvIHRoZSBsZWZ0LCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHJpZ2h0IGFsaWdubWVudAogICkKdml6MwpgYGAKCiMjIFJlZ3Jlc3Npb25zCkkgZG8gbm90IGZpbmQgdmlzdWFsIHJlcHJlc2VudGF0aW9ucyBvZiBhIGJpbmFyeSB2YXJpYWJsZSB0byBiZSB2ZXJ5IGhlbHBmdWwsIHNvIEkgZGlkIG5vdCBpbmNsdWRlIHRoZW0gaW4gdGhlIHBhcGVyLiBOb25ldGhlbGVzcywgaGVyZSB0aGV5IGFyZS4KCmBgYHtyIHJlZ3Jlc3Npb24xfQojIEJhc2ljIGJsYWNrIGFuZCB3aGl0ZSB2aXN1YWxpemF0aW9uCnJlZzEgPC0gbG0obG52aW9+c2hhbGwsIGRhdGE9Z3Vuc19kZikKcGxvdCgKICB4ID0gZ3Vuc19kZiRzaGFsbCwgCiAgeSA9IGd1bnNfZGYkbG52aW8sCiAgeGxhYiA9ICJTaGFsbC1Jc3N1ZSIsCiAgeWxhYiA9ICJSYXRlIG9mIFZpb2xlbmNlIChhcyBOYXR1cmFsIExvZykiLAogIG1haW4gPSAiQ29ycmVsYXRpb24gYmV0d2VlbiBTaGFsbC1Jc3N1ZSBsYXdzIGFuZCBWaW9sZW5jZSIKKSArIAphYmxpbmUocmVnMSkKCiMgUHJldHRpZXIgdmlzdWFsaXphdGlvbgojIFNldCBiYXNlIHByb3BlcnRpZXMgb2YgdGhlIGdyYXBoCmdncGxvdCgKICBkYXRhPWd1bnNfZGYsCiAgYWVzKHg9c2hhbGwsIHk9bG52aW8pCikgKwojIEdyYXBoIHBvaW50cwpnZW9tX3BvaW50KAogIGRhdGE9Z3Vuc19kZiwKICBhZXMoY29sb3I9Z3JvdXApLCAKICBhbHBoYSA9IDAuNQopICsKIyBHcmFwaCBsaW5lYXIgbW9kZWwgcmVncmVzc2lvbiBsaW5lCmdlb21fc21vb3RoKAogIG1ldGhvZCA9ICJsbSIsCiAgY29sb3I9ImJsYWNrIgopICsKIyBMYWJlbCB0aGluZ3MKbGFicyAoCiAgdGl0bGUgPSAiQ29ycmVsYXRpb24gYmV0d2VlbiBTaGFsbC1Jc3N1ZSBhbmQgVmlvbGVuY2UiLAogIHggPSAiU2hhbGwtSXNzdWUiLAogIHkgPSAiUmF0ZSBvZiBWaW9sZW5jZSAoYXMgTmF0dXJhbCBMb2cpIgopCmBgYAoKCg==